lucky

lucky

跟着好奇心,去探索我觉得酷的东西 希望以电子报分享所见所思的方式,结识更多朋友,碰撞出更多思维火花
github
bilibili
twitter
medium
youtube
zhihu
mastodon
follow
substack

GORM API 完全指南:Go 言語のデータベース操作の究極の武器を解放!

image
Go 言語の開発において、データベース操作はすべての開発者が避けられないトピックです。GORM は強力でデザインが優雅な ORM ライブラリとして、そのシンプルな API と豊富な機能により、Go 開発者の第一選択のツールとなっています。初心者でもベテランでも、GORM の API をマスターすることで、開発効率を数倍向上させることができます!

今日は、GORM のすべてのコア API を深く探求し、入門から上級まで、GORM の秘密を完全にマスターする手助けをします!

なぜ GORM を選ぶのか?#

GORM は単なる ORM ツールではなく、データベース操作のスイスアーミーナイフのようなものです。以下は GORM のコアの利点です:

  • シンプルな API 設計:チェーン呼び出しで、コードが明確で読みやすい。
  • 強力な機能サポート:CRUD、トランザクション、フック、プリロードなどの高度な機能をサポート。
  • 多様なデータベースサポート:MySQL、PostgreSQL、SQLite、SQL Server などの主要なデータベース。
  • 活発なコミュニティ:豊富なドキュメントとコミュニティサポートで、問題解決が迅速。

次に、初期化、モデル定義、CRUD 操作、高度な機能の 4 つの側面から、GORM の API を包括的に解析します!

1. 初期化と設定#

1.1 データベースに接続#

GORM は多様なデータベースをサポートしており、以下は MySQL に接続する例です:

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("データベース接続に失敗しました")
    }
    fmt.Println("データベースに接続されました!")
}

1.2 GORM の設定#

GORM はログレベル、テーブルプレフィックスなどの豊富な設定オプションを提供します:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info), // ログレベルを設定
    NamingStrategy: schema.NamingStrategy{
        TablePrefix: "t_", // テーブルプレフィックス
    },
})

2. モデル定義#

2.1 モデルの定義#

GORM は構造体を使用してモデルを定義し、各フィールドはタグ(Tag)を通じてデータベース制約を指定できます:

type User struct {
    gorm.Model        // gorm.Modelを埋め込む、ID、CreatedAt、UpdatedAt、DeletedAtを含む
    Name       string `gorm:"type:varchar(100);not null"`
    Age        int    `gorm:"default:18"`
    Email      string `gorm:"uniqueIndex"`
}

2.2 自動マイグレーション#

GORM はモデルに基づいて自動的にテーブル構造を作成または更新できます:

db.AutoMigrate(&User{}) // usersテーブルを自動作成

3. CRUD 操作#

3.1 レコードの作成#

// 単一レコードを作成
user := User{Name: "John", Age: 20}
result := db.Create(&user) // *gorm.DBを返す
fmt.Println(user.ID)       // 挿入された主キーを取得

// バッチ作成
users := []User{{Name: "Alice"}, {Name: "Bob"}}
db.Create(&users)

3.2 レコードのクエリ#

// 単一レコードをクエリ
var user User
db.First(&user, 1)          // 主キーでクエリ
db.First(&user, "name = ?", "John") // 条件クエリ

// 複数レコードをクエリ
var users []User
db.Find(&users)             // すべてのレコードをクエリ
db.Where("age > ?", 18).Find(&users) // 条件クエリ

// 特定のフィールドをクエリ
db.Select("name", "age").Find(&users)

// ソートとページネーション
db.Order("age desc").Limit(10).Offset(0).Find(&users)

3.3 レコードの更新#

// 単一レコードを更新
db.Model(&user).Update("Age", 21)

// 複数フィールドを更新
db.Model(&user).Updates(User{Name: "Alice", Age: 22})

// バッチ更新
db.Model(&User{}).Where("age < ?", 18).Update("age", 20)

3.4 レコードの削除#

// 単一レコードを削除
db.Delete(&user)

// 主キーで削除
db.Delete(&User{}, 1)

// バッチ削除
db.Where("age < ?", 18).Delete(&User{})

4. 高度な機能#

4.1 トランザクション処理#

GORM は手動および自動トランザクションをサポートします:

// 手動トランザクション
tx := db.Begin()
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
    tx.Rollback()
    return
}
tx.Commit()

// 自動トランザクション
db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&User{Name: "John"}).Error; err != nil {
        return err
    }
    return nil
})

4.2 フック関数#

GORM はモデルライフサイクルフックを提供し、特定のタイミングでカスタムロジックを実行できます:

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.CreatedAt = time.Now()
    return nil
}

func (u *User) AfterDelete(tx *gorm.DB) error {
    fmt.Println("ユーザーが削除されました:", u.ID)
    return nil
}

4.3 プリロード(N+1 クエリ問題の解決)#

type Order struct {
    gorm.Model
    UserID uint
    User   User
}

var orders []Order
db.Preload("User").Find(&orders) // 関連するUserデータをプリロード

4.4 生 SQL#

GORM は生 SQL 文を実行することをサポートします:

var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)

db.Exec("UPDATE users SET age = ? WHERE name = ?", 20, "John")

5. 関連関係#

5.1 一対一#

type Profile struct {
    gorm.Model
    UserID uint
    User   User
}

type User struct {
    gorm.Model
    Profile Profile
}

5.2 一対多#

type Order struct {
    gorm.Model
    UserID uint
    User   User
}

type User struct {
    gorm.Model
    Orders []Order
}

5.3 多対多#

type User struct {
    gorm.Model
    Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
    Name  string
    Users []User `gorm:"many2many:user_languages;"`
}

6. その他の機能#

6.1 ソフトデリート#

GORM はソフトデリートをサポートし、レコードは実際には削除されず、DeletedAt フィールドが設定されます:

db.Delete(&user) // ソフトデリート
db.Unscoped().Delete(&user) // ハードデリート

6.2 カスタムテーブル名#

func (User) TableName() string {
    return "custom_users"
}

まとめ#

GORM の API 設計はシンプルで強力であり、データベース操作のあらゆる側面をカバーしています。単純な CRUD 操作から複雑な関連クエリやトランザクション処理まで、GORM は簡単に対応できます。これらの API を熟知することで、開発効率を大幅に向上させ、より優雅で効率的な Go コードを書くことができます。

特定の機能についてさらに深く知りたい場合は、GORM 公式ドキュメントを参照して、詳細情報を取得してください。このガイドが GORM を完全にマスターし、データベース操作の究極の達人になる手助けとなることを願っています!

今すぐ GORM を試して、あなたの Go 言語開発を加速させましょう! 🚀

私の公式アカウント「全栈开发 ck」をフォローして、オリジナルの技術記事をいち早く受け取ってください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。